// Copyright Epic Games, Inc. All Rights Reserved.

#include "LyraUserFacingExperienceDefinition.h"
#include "CommonSessionSubsystem.h"
#include "Containers/UnrealString.h"
#include "UObject/NameTypes.h"
#include "Engine/GameInstance.h"
#include "Engine/Engine.h"
#include "Replays/LyraReplaySubsystem.h"

#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraUserFacingExperienceDefinition)

/**
 * 创建托管请求
 * @param WorldContextObject 世界上下文对象
 * @return 托管会话请求
 */
UCommonSession_HostSessionRequest* ULyraUserFacingExperienceDefinition::CreateHostingRequest(const UObject* WorldContextObject) const
{
	const FString ExperienceName = ExperienceID.PrimaryAssetName.ToString(); // 经验名称
	const FString UserFacingExperienceName = GetPrimaryAssetId().PrimaryAssetName.ToString(); // 用户面向经验名称

	UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::ReturnNull); // 从上下文对象获取世界
	UGameInstance* GameInstance = World ? World->GetGameInstance() : nullptr; // 获取游戏实例
	UCommonSession_HostSessionRequest* Result = nullptr; // 结果
	
	if (UCommonSessionSubsystem* Subsystem = GameInstance ? GameInstance->GetSubsystem<UCommonSessionSubsystem>() : nullptr) // 获取通用会话子系统
	{
		Result = Subsystem->CreateOnlineHostSessionRequest(); // 创建在线托管会话请求
	}

	if (!Result) // 如果无法使用子系统
	{
		// 创建一个
		Result = NewObject<UCommonSession_HostSessionRequest>(); // 创建新对象
		Result->OnlineMode = ECommonSessionOnlineMode::Online; // 设置在线模式
		Result->bUseLobbies = true; // 使用大厅
		Result->bUseLobbiesVoiceChat = false; // 不使用大厅语音聊天
		// 我们始终在此会话上启用存在，因为它是用于匹配的主要会话。对于关心存在的在线系统，只有主要会话应启用存在
		Result->bUsePresence = !IsRunningDedicatedServer(); // 如果不是专用服务器则启用存在
	}
	Result->MapID = MapID; // 设置地图ID
	Result->ModeNameForAdvertisement = UserFacingExperienceName; // 设置广告模式名称
	Result->ExtraArgs = ExtraArgs; // 设置额外参数
	Result->ExtraArgs.Add(TEXT("Experience"), ExperienceName); // 添加经验参数
	Result->MaxPlayerCount = MaxPlayerCount; // 设置最大玩家数量

	if (ULyraReplaySubsystem::DoesPlatformSupportReplays()) // 如果平台支持回放
	{
		if (bRecordReplay) // 如果录制回放
		{
			Result->ExtraArgs.Add(TEXT("DemoRec"), FString()); // 添加回放录制参数
		}
	}

	return Result; // 返回结果
}